#ifndef CTY_DAT_PARSER_H
#define CTY_DAT_PARSER_H

#include <string>
#include <vector>
#include <map>
#include <set>
#include <memory>

// 国家信息结构体
struct CountryInfo {
    std::string country_name;
    int cq_zone;
    int itu_zone;
    std::string continent;
    double latitude;
    double longitude;
    double utc_offset;
    std::string primary_prefix;
    bool is_waedc;  // 是否在DARC WAEDC列表中
    
    // 别名前缀信息（包含特殊标记）
    struct AliasPrefix {
        std::string prefix;
        bool exact_match;      // 是否需要精确匹配 (=)
        int cq_zone_override;  // CQ区域覆盖 (#)
        int itu_zone_override; // ITU区域覆盖 []
        double lat_override;    // 纬度覆盖 <
        double lon_override;    // 经度覆盖 >
        std::string continent_override; // 大陆覆盖 {}
        double utc_offset_override;     // 时区覆盖 ~
        bool has_cq_zone_override;
        bool has_itu_zone_override;
        bool has_lat_lon_override;
        bool has_continent_override;
        bool has_utc_offset_override;
        
        AliasPrefix() : exact_match(false), cq_zone_override(0), itu_zone_override(0), 
                       lat_override(0.0), lon_override(0.0), utc_offset_override(0.0),
                       has_cq_zone_override(false), has_itu_zone_override(false),
                       has_lat_lon_override(false), has_continent_override(false),
                       has_utc_offset_override(false) {}
    };
    
    std::vector<AliasPrefix> aliases;
    
    // 构造函数
    CountryInfo() : cq_zone(0), itu_zone(0), latitude(0.0), longitude(0.0), utc_offset(0.0), is_waedc(false) {}
};

class CTYDatParser {
public:
    CTYDatParser();
    ~CTYDatParser();
    
    // 加载CTY.DAT文件
    bool loadFromFile(const std::string& filepath);
    
    // 根据呼号查找国家信息
    const CountryInfo* lookupCountry(const std::string& callsign) const;
    
    // 获取所有国家信息
    const std::map<std::string, std::shared_ptr<CountryInfo>>& getAllCountries() const;
    
    // 获取错误信息
    const std::string& getLastError() const { return last_error_; }

private:
    // 解析一行数据
    bool parseLine(const std::string& line, CountryInfo& info);
    
    // 解析别名前缀
    std::vector<CountryInfo::AliasPrefix> parseAliasPrefixes(const std::string& prefixes_str);
    
    // 添加国家信息
    void addCountry(const CountryInfo& info, const std::vector<CountryInfo::AliasPrefix>& aliases);
    
    // 从呼号中提取可能的前缀
    std::vector<std::string> extractPossiblePrefixes(const std::string& callsign) const;

private:
    std::map<std::string, std::shared_ptr<CountryInfo>> countries_;
    std::map<std::string, std::shared_ptr<CountryInfo>> prefix_map_;  // 前缀到国家信息的映射
    std::string last_error_;
};

#endif // CTY_DAT_PARSER_H